/*
* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
*
* http://www.apache.org/licenses/LICENSE-2.0 
*
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/
const os = require('os');
const tsc = require('../../node_modules/typescript');
const fs = require('fs');
let vscode = null;
try {
  vscode = require('vscode');
}
catch (err) {
  vscode = null;
}

function replaceAll(s, sfrom, sto) {
  while (s.indexOf(sfrom) >= 0) {
    s = s.replace(sfrom, sto);
  }
  return s;
}

function detectPlatform() {
  let result = '';
  if (os.type() === 'Windows_NT') {
    result = 'win';
  } else if (os.type() === 'Darwin') {
    result = 'mac';
  } else if (os.type() === 'Linux') {
    result = 'Linux';
  }
  return result;
}

function checkFileError(ifname) {
  let program = tsc.createProgram([ifname], {});
  let emitResult = program.emit();
  let allDiagnostics = tsc.getPreEmitDiagnostics(program).concat(emitResult.diagnostics);

  let errorMsg = '';
  allDiagnostics.forEach(diagnostic => {
    if (diagnostic.file) {
      let { line, character } = tsc.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start);
      let message = tsc.flattenDiagnosticMessageText(diagnostic.messageText, '\n');
      errorMsg += `${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}\n`;
    } else {
      errorMsg += tsc.flattenDiagnosticMessageText(diagnostic.messageText, '\n') + '\n';
    }
  });

  if (allDiagnostics.length > 0) {
    return [false, errorMsg];
  }
  return [true, ''];
}

function utf8ArrayToStr(array) {
  var out, i, len, c;
  var char2, char3;

  out = '';
  len = array.length;
  i = 0;
  while (i < len) {
    c = array[i++];
    switch (c >> 4) {
      case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
        // 0xxxxxxx
        out += String.fromCharCode(c);
        break;
      case 12: case 13:
        // 110x xxxx   10xx xxxx
        char2 = array[i++];
        out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
        break;
      case 14:
        // 1110 xxxx  10xx xxxx  10xx xxxx
        char2 = array[i++];
        char3 = array[i++];
        out += String.fromCharCode(((c & 0x0F) << 12) |
          ((char2 & 0x3F) << 6) |
          ((char3 & 0x3F) << 0));
        break;
    }
  }

  return out;
}

function readFile(fn) {
  if (!fs.existsSync(fn)) {
    return '';
  }
  let data = fs.readFileSync(fn);
  data = utf8ArrayToStr(data);
  return data;
}

function writeFile(fn, content) {
  if (!fs.existsSync(fn)) {
    return '';
  }
  fs.writeFileSync(fn, content);
  return 'writeFileSync success';
}

module.exports = {
  replaceAll,
  detectPlatform,
  checkFileError,
  readFile,
  writeFile
};